From: Matthias Clasen Date: Tue, 7 Aug 2012 04:38:48 +0000 (-0400) Subject: Optimize gtk_widget_path_copy() by preallocating "elems" array X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~39^2~16710 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f89d5c828038654802526c9ea68e6fb52fa461d3;p=gtk%2B3.0.git Optimize gtk_widget_path_copy() by preallocating "elems" array gtk_widget_path_copy() currently calls g_array_append_val() in a loop, which is inefficient due to reallocating the array's memory. Calling g_array_set_size() before entering the loop reduces the number of CPU cycles used by roughly 30%. Patch by John Lindgren, https://bugzilla.gnome.org/show_bug.cgi?id=679978 --- diff --git a/gtk/gtkwidgetpath.c b/gtk/gtkwidgetpath.c index 00afbe0b9e..855902fd68 100644 --- a/gtk/gtkwidgetpath.c +++ b/gtk/gtkwidgetpath.c @@ -174,15 +174,16 @@ gtk_widget_path_copy (const GtkWidgetPath *path) new_path = gtk_widget_path_new (); + g_array_set_size (new_path->elems, path->elems->len); + for (i = 0; i < path->elems->len; i++) { - GtkPathElement *elem, new; + GtkPathElement *elem, *dest; elem = &g_array_index (path->elems, GtkPathElement, i); + dest = &g_array_index (new_path->elems, GtkPathElement, i); - gtk_path_element_copy (&new, elem); - - g_array_append_val (new_path->elems, new); + gtk_path_element_copy (dest, elem); } return new_path;